Reactμ μλ λ°°μΉ κΈ°λ₯μ λν μ’ ν© κ°μ΄λμ λλ€. μ΄μ , νκ³, κ·Έλ¦¬κ³ λ λΆλλ¬μ΄ μ ν리μΌμ΄μ μ±λ₯μ μν κ³ κΈ μ΅μ ν κΈ°λ²μ μμλ΄ λλ€.
React λ°°μΉ(Batching): μν μ λ°μ΄νΈ μ΅μ νλ‘ μ±λ₯ ν₯μνκΈ°
λμμμ΄ λ°μ νλ μΉ κ°λ° νκ²½μμ μ ν리μΌμ΄μ μ±λ₯ μ΅μ νλ λ§€μ° μ€μν©λλ€. μ¬μ©μ μΈν°νμ΄μ€ ꡬμΆμ μν μ λμ μΈ μλ°μ€ν¬λ¦½νΈ λΌμ΄λΈλ¬λ¦¬μΈ Reactλ ν¨μ¨μ±μ λμ΄κΈ° μν μ¬λ¬ λ©μ»€λμ¦μ μ 곡ν©λλ€. κ·Έμ€ νλκ° λ°λ‘ μ’ μ’ λ³΄μ΄μ§ μλ κ³³μμ μλνλ λ°°μΉ(batching)μ λλ€. μ΄ κΈμμλ React λ°°μΉμ κ°λ , μ΄μ , νκ³, κ·Έλ¦¬κ³ λ λΆλλ½κ³ λ°μμ± μ’μ μ¬μ©μ κ²½νμ μ 곡νκΈ° μν μν μ λ°μ΄νΈ μ΅μ ν κ³ κΈ κΈ°λ²μ λν΄ μ’ ν©μ μΌλ‘ νꡬν©λλ€.
React λ°°μΉλ 무μμΈκ°?
React λ°°μΉλ Reactκ° μ¬λ¬ μν μ λ°μ΄νΈλ₯Ό νλμ 리λ λλ§μΌλ‘ κ·Έλ£Ήννλ μ±λ₯ μ΅μ ν κΈ°λ²μ λλ€. μ¦, κ° μν λ³κ²½λ§λ€ μ»΄ν¬λνΈλ₯Ό μ¬λ¬ λ² λ¦¬λ λλ§νλ λμ , Reactλ λͺ¨λ μν μ λ°μ΄νΈκ° μλ£λ λκΉμ§ κΈ°λ€λ Έλ€κ° λ¨μΌ μ λ°μ΄νΈλ₯Ό μνν©λλ€. μ΄λ 리λ λλ§ νμλ₯Ό ν¬κ² μ€μ¬ μ±λ₯μ κ°μ νκ³ μ¬μ©μ μΈν°νμ΄μ€μ λ°μμ±μ λμ λλ€.
React 18 μ΄μ μλ λ°°μΉκ° React μ΄λ²€νΈ νΈλ€λ¬ λ΄μμλ§ λ°μνμ΅λλ€. setTimeout
, νλ‘λ―Έμ€(promise), λ€μ΄ν°λΈ μ΄λ²€νΈ νΈλ€λ¬ λ΄μ μν μ
λ°μ΄νΈμ κ°μ΄ μ΄λ¬ν νΈλ€λ¬ μΈλΆμ μν μ
λ°μ΄νΈλ λ°°μΉ μ²λ¦¬λμ§ μμμ΅λλ€. μ΄λ‘ μΈν΄ μκΈ°μΉ μμ 리λ λλ§κ³Ό μ±λ₯ λ³λͺ© νμμ΄ μ’
μ’
λ°μνμ΅λλ€.
React 18μ μλ λ°°μΉκ° λμ λλ©΄μ μ΄ νκ³κ° 극볡λμμ΅λλ€. μ΄μ Reactλ λ€μκ³Ό κ°μ λ λ§μ μλ리μ€μμ μν μ λ°μ΄νΈλ₯Ό μλμΌλ‘ λ°°μΉν©λλ€:
- React μ΄λ²€νΈ νΈλ€λ¬ (μ:
onClick
,onChange
) - λΉλκΈ° μλ°μ€ν¬λ¦½νΈ ν¨μ (μ:
setTimeout
,Promise.then
) - λ€μ΄ν°λΈ μ΄λ²€νΈ νΈλ€λ¬ (μ: DOM μμμ μ§μ μ°κ²°λ μ΄λ²€νΈ 리μ€λ)
React λ°°μΉμ μ΄μ
React λ°°μΉμ μ΄μ μ μλΉνλ©° μ¬μ©μ κ²½νμ μ§μ μ μΈ μν₯μ λ―ΈμΉ©λλ€:
- μ±λ₯ ν₯μ: 리λ λλ§ νμλ₯Ό μ€μ΄λ©΄ DOMμ μ λ°μ΄νΈνλ λ° μμλλ μκ°μ΄ μ΅μνλμ΄ λ λλ§μ΄ λΉ¨λΌμ§κ³ UI λ°μμ±μ΄ ν₯μλ©λλ€.
- 리μμ€ μλΉ κ°μ: 리λ λλ§ νμκ° μ€μ΄λ€λ©΄ CPU λ° λ©λͺ¨λ¦¬ μ¬μ©λμ΄ κ°μνμ¬ λͺ¨λ°μΌ κΈ°κΈ°μ λ°°ν°λ¦¬ μλͺ μ΄ κΈΈμ΄μ§κ³ μλ² μΈ‘ λ λλ§μ μ¬μ©νλ μ ν리μΌμ΄μ μ μλ² λΉμ©μ΄ μ κ°λ©λλ€.
- μ¬μ©μ κ²½ν ν₯μ: λ λΆλλ½κ³ λ°μμ±μ΄ μ’μ UIλ μ λ°μ μΈ μ¬μ©μ κ²½νμ κ°μ νμ¬ μ ν리μΌμ΄μ μ λ μΈλ ¨λκ³ μ λ¬Έμ μΌλ‘ 보μ΄κ² ν©λλ€.
- μ½λ λ¨μν: μλ λ°°μΉλ μλ μ΅μ ν κΈ°λ²μ νμμ±μ μ κ±°νμ¬ κ°λ°μ λ¨μννλ―λ‘, κ°λ°μλ μ±λ₯ λ―ΈμΈ μ‘°μ 보λ€λ κΈ°λ₯ ꡬμΆμ μ§μ€ν μ μμ΅λλ€.
React λ°°μΉμ μλ λ°©μ
Reactμ λ°°μΉ λ©μ»€λμ¦μ μ‘°μ (reconciliation) νλ‘μΈμ€μ λ΄μ₯λμ΄ μμ΅λλ€. μν μ λ°μ΄νΈκ° νΈλ¦¬κ±°λλ©΄ Reactλ μ¦μ μ»΄ν¬λνΈλ₯Ό 리λ λλ§νμ§ μμ΅λλ€. λμ μ λ°μ΄νΈλ₯Ό νμ μΆκ°ν©λλ€. μ§§μ μκ° λ΄μ μ¬λ¬ μ λ°μ΄νΈκ° λ°μνλ©΄ Reactλ μ΄λ₯Ό λ¨μΌ μ λ°μ΄νΈλ‘ ν΅ν©ν©λλ€. κ·Έλ° λ€μ μ΄ ν΅ν©λ μ λ°μ΄νΈλ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈλ₯Ό ν λ²λ§ 리λ λλ§νμ¬ λͺ¨λ λ³κ²½ μ¬νμ ν λ²μ λ°μν©λλ€.
κ°λ¨ν μμλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
import React, { useState } from 'react';
function ExampleComponent() {
const [count1, setCount1] = useState(0);
const [count2, setCount2] = useState(0);
const handleClick = () => {
setCount1(count1 + 1);
setCount2(count2 + 1);
};
console.log('Component re-rendered');
return (
<div>
<p>Count 1: {count1}</p>
<p>Count 2: {count2}</p>
<button onClick={handleClick}>Increment Both</button>
</div>
);
}
export default ExampleComponent;
μ΄ μμμμ λ²νΌμ ν΄λ¦νλ©΄ setCount1
κ³Ό setCount2
κ° λμΌν μ΄λ²€νΈ νΈλ€λ¬ λ΄μμ νΈμΆλ©λλ€. Reactλ μ΄ λ μν μ
λ°μ΄νΈλ₯Ό λ°°μΉ μ²λ¦¬νκ³ μ»΄ν¬λνΈλ₯Ό λ¨ ν λ²λ§ 리λ λλ§ν©λλ€. μ½μμλ ν΄λ¦λΉ ν λ²λ§ "Component re-rendered"κ° κΈ°λ‘λμ΄ λ°°μΉκ° μλνλ κ²μ 보μ¬μ€λλ€.
λ°°μΉλμ§ μλ μ λ°μ΄νΈ: λ°°μΉκ° μ μ©λμ§ μλ κ²½μ°
React 18μμλ λλΆλΆμ μλ리μ€μ μλ λ°°μΉκ° λμ λμμ§λ§, λ°°μΉλ₯Ό μ°ννκ³ Reactκ° μ¦μ μ»΄ν¬λνΈλ₯Ό μ λ°μ΄νΈνλλ‘ κ°μ νκ³ μΆμ μν©μ΄ μμ μ μμ΅λλ€. μ΄λ μΌλ°μ μΌλ‘ μν μ λ°μ΄νΈ μ§ν μ λ°μ΄νΈλ DOM κ°μ μ½μ΄μΌ ν λ νμν©λλ€.
Reactλ μ΄λ₯Ό μν΄ flushSync
APIλ₯Ό μ 곡ν©λλ€. flushSync
λ Reactκ° λ³΄λ₯ μ€μΈ λͺ¨λ μ
λ°μ΄νΈλ₯Ό λκΈ°μ μΌλ‘ νλ¬μνκ³ μ¦μ DOMμ μ
λ°μ΄νΈνλλ‘ κ°μ ν©λλ€.
λ€μμ μμμ λλ€:
import React, { useState } from 'react';
import { flushSync } from 'react-dom';
function ExampleComponent() {
const [text, setText] = useState('');
const handleChange = (event) => {
flushSync(() => {
setText(event.target.value);
});
console.log('Input value after update:', event.target.value);
};
return (
<input type="text" value={text} onChange={handleChange} />
);
}
export default ExampleComponent;
μ΄ μμμμλ flushSync
λ₯Ό μ¬μ©νμ¬ μ
λ ₯ κ°μ΄ λ³κ²½λ μ§ν text
μνκ° μ
λ°μ΄νΈλλλ‘ ν©λλ€. μ΄λ₯Ό ν΅ν΄ λ€μ λ λλ§ μ£ΌκΈ°λ₯Ό κΈ°λ€λ¦¬μ§ μκ³ handleChange
ν¨μμμ μ
λ°μ΄νΈλ κ°μ μ½μ μ μμ΅λλ€. νμ§λ§ flushSync
λ μ±λ₯μ λΆμ μ μΈ μν₯μ λ―ΈμΉ μ μμΌλ―λ‘ μ μ€νκ² μ¬μ©ν΄μΌ ν©λλ€.
κ³ κΈ μ΅μ ν κΈ°λ²
React λ°°μΉκ° μλΉν μ±λ₯ ν₯μμ μ 곡νμ§λ§, μ ν리μΌμ΄μ μ μ±λ₯μ λμ± ν₯μμν€κΈ° μν΄ μ¬μ©ν μ μλ μΆκ°μ μΈ μ΅μ ν κΈ°λ²μ΄ μμ΅λλ€.
1. ν¨μν μ λ°μ΄νΈ μ¬μ©νκΈ°
μ΄μ κ°μ κΈ°λ°μΌλ‘ μνλ₯Ό μ λ°μ΄νΈν λλ ν¨μν μ λ°μ΄νΈλ₯Ό μ¬μ©νλ κ²μ΄ κ°μ₯ μ’μ΅λλ€. ν¨μν μ λ°μ΄νΈλ νΉν λΉλκΈ° μμ μ΄λ λ°°μΉ μ λ°μ΄νΈκ° ν¬ν¨λ μλ리μ€μμ κ°μ₯ μ΅μ μν κ°μΌλ‘ μμ νκ³ μμμ 보μ₯ν©λλ€.
λ€μ λμ :
setCount(count + 1);
λ€μμ μ¬μ©νμΈμ:
setCount((prevCount) => prevCount + 1);
ν¨μν μ λ°μ΄νΈλ μ€λλ ν΄λ‘μ (stale closures)μ κ΄λ ¨λ λ¬Έμ λ₯Ό λ°©μ§νκ³ μ νν μν μ λ°μ΄νΈλ₯Ό 보μ₯ν©λλ€.
2. λΆλ³μ±
μνλ₯Ό λΆλ³(immutable)μΌλ‘ μ·¨κΈνλ κ²μ Reactμμ ν¨μ¨μ μΈ λ λλ§μ μν΄ λ§€μ° μ€μν©λλ€. μνκ° λΆλ³μΌ λ, Reactλ μ΄μ μνμ μ μν κ°μ μ°Έμ‘°λ₯Ό λΉκ΅νμ¬ μ»΄ν¬λνΈλ₯Ό 리λ λλ§ν΄μΌ νλμ§ μ μνκ² νλ¨ν μ μμ΅λλ€. μ°Έμ‘°κ° λ€λ₯΄λ©΄ Reactλ μνκ° λ³κ²½λμμμ μκ³ λ¦¬λ λλ§μ΄ νμνλ€κ³ νλ¨ν©λλ€. μ°Έμ‘°κ° κ°λ€λ©΄ Reactλ 리λ λλ§μ 건λλ°μ΄ κ·μ€ν μ²λ¦¬ μκ°μ μ μ½ν μ μμ΅λλ€.
κ°μ²΄λ λ°°μ΄λ‘ μμ ν λ κΈ°μ‘΄ μνλ₯Ό μ§μ μμ νμ§ λ§μΈμ. λμ , μνλ λ³κ²½ μ¬νμ μ μ©ν κ°μ²΄λ λ°°μ΄μ μ 볡μ¬λ³Έμ λ§λμΈμ.
μλ₯Ό λ€μ΄, λ€μ λμ :
const updatedItems = items;
updatedItems.push(newItem);
setItems(updatedItems);
λ€μμ μ¬μ©νμΈμ:
setItems([...items, newItem]);
μ κ° μ°μ°μ(...
)λ κΈ°μ‘΄ νλͺ©κ³Ό μ νλͺ©μ΄ λμ μΆκ°λ μ λ°°μ΄μ λ§λλλ€.
3. λ©λͺ¨μ΄μ μ΄μ (Memoization)
λ©λͺ¨μ΄μ μ΄μ
μ λΉμ©μ΄ λ§μ΄ λλ ν¨μ νΈμΆ κ²°κ³Όλ₯Ό μΊμ±νκ³ λμΌν μ
λ ₯μ΄ λ€μ λ°μν λ μΊμλ κ²°κ³Όλ₯Ό λ°ννλ κ°λ ₯ν μ΅μ ν κΈ°λ²μ
λλ€. Reactλ React.memo
, useMemo
, useCallback
μ ν¬ν¨ν μ¬λ¬ λ©λͺ¨μ΄μ μ΄μ
λꡬλ₯Ό μ 곡ν©λλ€.
React.memo
: ν¨μν μ»΄ν¬λνΈλ₯Ό λ©λͺ¨μ΄μ μ΄μ νλ κ³ μ°¨ μ»΄ν¬λνΈ(HOC)μ λλ€. propsκ° λ³κ²½λμ§ μμλ€λ©΄ μ»΄ν¬λνΈκ° 리λ λλ§λλ κ²μ λ°©μ§ν©λλ€.useMemo
: ν¨μμ κ²°κ³Όλ₯Ό λ©λͺ¨μ΄μ μ΄μ νλ ν μ λλ€. μμ‘΄μ±μ΄ λ³κ²½λ λλ§ κ°μ λ€μ κ³μ°ν©λλ€.useCallback
: ν¨μ μ체λ₯Ό λ©λͺ¨μ΄μ μ΄μ νλ ν μ λλ€. μμ‘΄μ±μ΄ λ³κ²½λ λλ§ λ³κ²½λλ λ©λͺ¨μ΄μ μ΄μ λ λ²μ μ ν¨μλ₯Ό λ°νν©λλ€. μ΄λ μμ μ»΄ν¬λνΈμ μ½λ°±μ μ λ¬νμ¬ λΆνμν 리λ λλ§μ λ°©μ§νλ λ° νΉν μ μ©ν©λλ€.
λ€μμ React.memo
λ₯Ό μ¬μ©νλ μμμ
λλ€:
import React from 'react';
const MyComponent = React.memo(({ data }) => {
console.log('MyComponent re-rendered');
return <div>{data.name}</div>;
});
export default MyComponent;
μ΄ μμμμ MyComponent
λ data
propμ΄ λ³κ²½λ κ²½μ°μλ§ λ¦¬λ λλ§λ©λλ€.
4. μ½λ μ€ν리ν (Code Splitting)
μ½λ μ€ν리ν
μ μ ν리μΌμ΄μ
μ νμμ λ°λΌ λ‘λν μ μλ λ μμ μ²ν¬λ‘ λλλ κ΄νμ
λλ€. μ΄λ μ΄κΈ° λ‘λ μκ°μ μ€μ΄κ³ μ ν리μΌμ΄μ
μ μ λ°μ μΈ μ±λ₯μ ν₯μμν΅λλ€. Reactλ λμ importμ React.lazy
λ° Suspense
μ»΄ν¬λνΈλ₯Ό ν¬ν¨νμ¬ μ½λ μ€ν리ν
μ ꡬννλ μ¬λ¬ λ°©λ²μ μ 곡ν©λλ€.
λ€μμ React.lazy
μ Suspense
λ₯Ό μ¬μ©νλ μμμ
λλ€:
import React, { Suspense } from 'react';
const MyComponent = React.lazy(() => import('./MyComponent'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<MyComponent />
</Suspense>
);
}
export default App;
μ΄ μμμμ MyComponent
λ React.lazy
λ₯Ό μ¬μ©νμ¬ λΉλκΈ°μ μΌλ‘ λ‘λλ©λλ€. Suspense
μ»΄ν¬λνΈλ μ»΄ν¬λνΈκ° λ‘λλλ λμ ν΄λ°±(fallback) UIλ₯Ό νμν©λλ€.
5. κ°μν(Virtualization)
κ°μνλ ν° λͺ©λ‘μ΄λ ν μ΄λΈμ ν¨μ¨μ μΌλ‘ λ λλ§νλ κΈ°λ²μ λλ€. λͺ¨λ νλͺ©μ ν λ²μ λ λλ§νλ λμ , κ°μνλ νμ¬ νλ©΄μ 보μ΄λ νλͺ©λ§ λ λλ§ν©λλ€. μ¬μ©μκ° μ€ν¬λ‘€νλ©΄ μ νλͺ©μ΄ λ λλ§λκ³ μ΄μ νλͺ©μ DOMμμ μ κ±°λ©λλ€.
react-virtualized
λ° react-window
μ κ°μ λΌμ΄λΈλ¬λ¦¬λ React μ ν리μΌμ΄μ
μμ κ°μνλ₯Ό ꡬννκΈ° μν μ»΄ν¬λνΈλ₯Ό μ 곡ν©λλ€.
6. λλ°μ΄μ±(Debouncing)κ³Ό μ€λ‘νλ§(Throttling)
λλ°μ΄μ±κ³Ό μ€λ‘νλ§μ ν¨μκ° μ€νλλ λΉλλ₯Ό μ ννλ κΈ°λ²μ λλ€. λλ°μ΄μ±μ νΉμ λΉνμ± κΈ°κ°μ΄ μ§λ νμ ν¨μ μ€νμ μ§μ°μν΅λλ€. μ€λ‘νλ§μ μ£Όμ΄μ§ μκ° λ΄μ ν¨μλ₯Ό μ΅λ ν λ²λ§ μ€νν©λλ€.
μ΄λ¬ν κΈ°λ²μ μ€ν¬λ‘€ μ΄λ²€νΈ, 리μ¬μ΄μ¦ μ΄λ²€νΈ, μ λ ₯ μ΄λ²€νΈμ κ°μ΄ λΉ λ₯΄κ² λ°μνλ μ΄λ²€νΈλ₯Ό μ²λ¦¬νλ λ° νΉν μ μ©ν©λλ€. μ΄λ¬ν μ΄λ²€νΈλ₯Ό λλ°μ΄μ±νκ±°λ μ€λ‘νλ§ν¨μΌλ‘μ¨ κ³Όλν 리λ λλ§μ λ°©μ§νκ³ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
μλ₯Ό λ€μ΄, lodash.debounce
ν¨μλ₯Ό μ¬μ©νμ¬ μ
λ ₯ μ΄λ²€νΈλ₯Ό λλ°μ΄μ±ν μ μμ΅λλ€:
import React, { useState, useCallback } from 'react';
import debounce from 'lodash.debounce';
function ExampleComponent() {
const [text, setText] = useState('');
const handleChange = useCallback(
debounce((event) => {
setText(event.target.value);
}, 300),
[]
);
return (
<input type="text" onChange={handleChange} />
);
}
export default ExampleComponent;
μ΄ μμμμ handleChange
ν¨μλ 300λ°λ¦¬μ΄μ μ§μ°μΌλ‘ λλ°μ΄μ±λ©λλ€. μ΄λ μ¬μ©μκ° 300λ°λ¦¬μ΄ λμ νμ΄νμ λ©μΆ νμλ§ setText
ν¨μκ° νΈμΆλλ€λ κ²μ μλ―Έν©λλ€.
μ€μ μ¬λ‘ λ° μΌμ΄μ€ μ€ν°λ
React λ°°μΉ λ° μ΅μ ν κΈ°λ²μ μ€μ μ μΈ μν₯μ μ€λͺ νκΈ° μν΄ λͺ κ°μ§ μ€μ μ¬λ‘λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
- μ μ μκ±°λ μΉμ¬μ΄νΈ: 볡μ‘ν μν λͺ©λ‘ νμ΄μ§κ° μλ μ μ μκ±°λ μΉμ¬μ΄νΈλ λ°°μΉλ‘λΆν° μλΉν μ΄μ μ μ»μ μ μμ΅λλ€. μ¬λ¬ νν°(μ: κ°κ²© λ²μ, λΈλλ, νμ )λ₯Ό λμμ μ λ°μ΄νΈνλ©΄ μ¬λ¬ μν μ λ°μ΄νΈκ° νΈλ¦¬κ±°λ μ μμ΅λλ€. λ°°μΉλ μ΄λ¬ν μ λ°μ΄νΈκ° λ¨μΌ 리λ λλ§μΌλ‘ ν΅ν©λλλ‘ νμ¬ μν λͺ©λ‘μ λ°μμ±μ ν₯μμν΅λλ€.
- μ€μκ° λμ보λ: μμ£Ό μ λ°μ΄νΈλλ λ°μ΄ν°λ₯Ό νμνλ μ€μκ° λμ보λλ λ°°μΉλ₯Ό νμ©νμ¬ μ±λ₯μ μ΅μ νν μ μμ΅λλ€. λ°μ΄ν° μ€νΈλ¦Όμ μ λ°μ΄νΈλ₯Ό λ°°μΉ μ²λ¦¬ν¨μΌλ‘μ¨ λμ보λλ λΆνμν 리λ λλ§μ νΌνκ³ λΆλλ½κ³ λ°μμ±μ΄ μ’μ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό μ μ§ν μ μμ΅λλ€.
- λνν μμ: μ¬λ¬ μ λ ₯ νλμ μ ν¨μ± κ²μ¬ κ·μΉμ΄ μλ 볡μ‘ν μμλ λ°°μΉμ μ΄μ μ λ릴 μ μμ΅λλ€. μ¬λ¬ μμ νλλ₯Ό λμμ μ λ°μ΄νΈνλ©΄ μ¬λ¬ μν μ λ°μ΄νΈκ° νΈλ¦¬κ±°λ μ μμ΅λλ€. λ°°μΉλ μ΄λ¬ν μ λ°μ΄νΈκ° λ¨μΌ 리λ λλ§μΌλ‘ ν΅ν©λλλ‘ νμ¬ μμμ λ°μμ±μ ν₯μμν΅λλ€.
λ°°μΉ λ¬Έμ λλ²κΉ νκΈ°
λ°°μΉκ° μΌλ°μ μΌλ‘ μ±λ₯μ ν₯μμν€μ§λ§, λ°°μΉμ κ΄λ ¨λ λ¬Έμ λ₯Ό λλ²κΉ ν΄μΌ νλ μλ리μ€κ° μμ μ μμ΅λλ€. λ€μμ λ°°μΉ λ¬Έμ λ₯Ό λλ²κΉ νκΈ° μν λͺ κ°μ§ νμ λλ€:
- React κ°λ°μ λꡬ μ¬μ©: React κ°λ°μ λꡬλ₯Ό μ¬μ©νλ©΄ μ»΄ν¬λνΈ νΈλ¦¬λ₯Ό κ²μ¬νκ³ λ¦¬λ λλ§μ λͺ¨λν°λ§ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ λΆνμνκ² λ¦¬λ λλ§λλ μ»΄ν¬λνΈλ₯Ό μλ³νλ λ° λμμ΄ λ©λλ€.
console.log
λ¬Έ μ¬μ©: μ»΄ν¬λνΈ λ΄μconsole.log
λ¬Έμ μΆκ°νλ©΄ μ»΄ν¬λνΈκ° μΈμ 리λ λλ§λλμ§, 무μμ΄ λ¦¬λ λλ§μ μ λ°νλμ§ μΆμ νλ λ° λμμ΄ λ μ μμ΅λλ€.why-did-you-update
λΌμ΄λΈλ¬λ¦¬ μ¬μ©: μ΄ λΌμ΄λΈλ¬λ¦¬λ μ΄μ λ° νμ¬ propsμ μν κ°μ λΉκ΅νμ¬ μ»΄ν¬λνΈκ° 리λ λλ§λλ μ΄μ λ₯Ό μλ³νλ λ° λμμ μ€λλ€.- λΆνμν μν μ λ°μ΄νΈ νμΈ: μνλ₯Ό λΆνμνκ² μ λ°μ΄νΈνκ³ μμ§ μμμ§ νμΈνμΈμ. μλ₯Ό λ€μ΄, λμΌν κ°μ κΈ°λ°μΌλ‘ μνλ₯Ό μ λ°μ΄νΈνκ±°λ λͺ¨λ λ λλ§ μ£ΌκΈ°μμ μνλ₯Ό μ λ°μ΄νΈνλ κ²μ νΌνμΈμ.
flushSync
μ¬μ© κ³ λ €: λ°°μΉκ° λ¬Έμ λ₯Ό μΌμΌν¨λ€κ³ μμ¬λλ κ²½μ°flushSync
λ₯Ό μ¬μ©νμ¬ Reactκ° μ¦μ μ»΄ν¬λνΈλ₯Ό μ λ°μ΄νΈνλλ‘ μλν΄ λ³΄μΈμ. νμ§λ§flushSync
λ μ±λ₯μ λΆμ μ μΈ μν₯μ λ―ΈμΉ μ μμΌλ―λ‘ μ μ€νκ² μ¬μ©ν΄μΌ ν©λλ€.
μν μ λ°μ΄νΈ μ΅μ νλ₯Ό μν λͺ¨λ² μ¬λ‘
μμ½νμλ©΄, λ€μμ Reactμμ μν μ λ°μ΄νΈλ₯Ό μ΅μ ννκΈ° μν λͺ κ°μ§ λͺ¨λ² μ¬λ‘μ λλ€:
- React λ°°μΉ μ΄ν΄νκΈ°: React λ°°μΉκ° μ΄λ»κ² μλνλμ§, κ·Έλ¦¬κ³ κ·Έ μ΄μ κ³Ό νκ³λ₯Ό μΈμ§νμΈμ.
- ν¨μν μ λ°μ΄νΈ μ¬μ©νκΈ°: μ΄μ κ°μ κΈ°λ°μΌλ‘ μνλ₯Ό μ λ°μ΄νΈν λλ ν¨μν μ λ°μ΄νΈλ₯Ό μ¬μ©νμΈμ.
- μνλ₯Ό λΆλ³μΌλ‘ μ·¨κΈνκΈ°: μνλ₯Ό λΆλ³μΌλ‘ μ·¨κΈνκ³ κΈ°μ‘΄ μν κ°μ μ§μ μμ νμ§ λ§μΈμ.
- λ©λͺ¨μ΄μ μ΄μ
μ¬μ©νκΈ°:
React.memo
,useMemo
,useCallback
μ μ¬μ©νμ¬ μ»΄ν¬λνΈμ ν¨μ νΈμΆμ λ©λͺ¨μ΄μ μ΄μ νμΈμ. - μ½λ μ€ν리ν ꡬννκΈ°: μ½λ μ€ν리ν μ ꡬννμ¬ μ ν리μΌμ΄μ μ μ΄κΈ° λ‘λ μκ°μ μ€μ΄μΈμ.
- κ°μν μ¬μ©νκΈ°: κ°μνλ₯Ό μ¬μ©νμ¬ ν° λͺ©λ‘κ³Ό ν μ΄λΈμ ν¨μ¨μ μΌλ‘ λ λλ§νμΈμ.
- μ΄λ²€νΈ λλ°μ΄μ± λ° μ€λ‘νλ§νκΈ°: λΉ λ₯΄κ² λ°μνλ μ΄λ²€νΈλ₯Ό λλ°μ΄μ±νκ³ μ€λ‘νλ§νμ¬ κ³Όλν 리λ λλ§μ λ°©μ§νμΈμ.
- μ ν리μΌμ΄μ νλ‘νμΌλ§νκΈ°: React Profilerλ₯Ό μ¬μ©νμ¬ μ±λ₯ λ³λͺ© νμμ μλ³νκ³ κ·Έμ λ°λΌ μ½λλ₯Ό μ΅μ ννμΈμ.
κ²°λ‘
React λ°°μΉλ React μ ν리μΌμ΄μ μ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μλ κ°λ ₯ν μ΅μ ν κΈ°λ²μ λλ€. λ°°μΉκ° μ΄λ»κ² μλνλμ§ μ΄ν΄νκ³ μΆκ°μ μΈ μ΅μ ν κΈ°λ²μ μ¬μ©ν¨μΌλ‘μ¨ λ λΆλλ½κ³ , λ°μμ±μ΄ μ’μΌλ©°, λ μ¦κ±°μ΄ μ¬μ©μ κ²½νμ μ 곡ν μ μμ΅λλ€. μ΄λ¬ν μμΉμ λ°μλ€μ΄κ³ React κ°λ° κ΄νμμ μ§μμ μΈ κ°μ μ μν΄ λ Έλ ₯νμΈμ.
μ΄λ¬ν κ°μ΄λλΌμΈμ λ°λ₯΄κ³ μ ν리μΌμ΄μ μ μ±λ₯μ μ§μμ μΌλ‘ λͺ¨λν°λ§ν¨μΌλ‘μ¨, μ μΈκ³ μ¬μ©μκ° μ¬μ©νκΈ°μ ν¨μ¨μ μ΄κ³ μ¦κ±°μ΄ React μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€.